package com.chenfan.magic.interpreter;

import com.chenfan.magic.core.IdcEngineEntry;
import com.chenfan.magic.utils.Func;
import com.chenfan.magic.utils.SpringUtil;
import com.chenfan.magic.utils.StringKit;
import lombok.AllArgsConstructor;

import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;

/**
 * @author 周夕
 * @date 2020-02-26 14:32
 */
@AllArgsConstructor
public class __InterpreterBuilder {

    /**
     * 解析器缓存池
     */
    private static Map<String, __IInterpreter> interpreterPool = new ConcurrentHashMap<>();

    static {
        interpreterPool.put(GroovyInterpreter.TYPE_CODE.toUpperCase(), SpringUtil.getBean(GroovyInterpreter.class));
        if (StringKit.isNotBlank(GroovyInterpreter.ALIAS)) {
            interpreterPool.put(GroovyInterpreter.ALIAS.toUpperCase(), SpringUtil.getBean(GroovyInterpreter.class));
        }
        interpreterPool.put(JavaInterpreter.TYPE_CODE.toUpperCase(), SpringUtil.getBean(JavaInterpreter.class));
        if (StringKit.isNotBlank(JavaInterpreter.ALIAS)) {
            interpreterPool.put(JavaInterpreter.ALIAS.toUpperCase(), SpringUtil.getBean(JavaInterpreter.class));
        }
        interpreterPool.put(JavascriptInterpreter.TYPE_CODE.toUpperCase(), SpringUtil.getBean(JavascriptInterpreter.class));
        if (StringKit.isNotBlank(JavascriptInterpreter.ALIAS)) {
            interpreterPool.put(JavascriptInterpreter.ALIAS.toUpperCase(), SpringUtil.getBean(JavascriptInterpreter.class));
        }
        interpreterPool.put(NashornInterpreter.TYPE_CODE.toUpperCase(), SpringUtil.getBean(NashornInterpreter.class));
        if (StringKit.isNotBlank(NashornInterpreter.ALIAS)) {
            interpreterPool.put(NashornInterpreter.ALIAS.toUpperCase(), SpringUtil.getBean(NashornInterpreter.class));
        }
        interpreterPool.put(PythonInterpreter.TYPE_CODE.toUpperCase(), SpringUtil.getBean(PythonInterpreter.class));
        if (StringKit.isNotBlank(PythonInterpreter.ALIAS)) {
            interpreterPool.put(PythonInterpreter.ALIAS.toUpperCase(), SpringUtil.getBean(PythonInterpreter.class));
        }
        interpreterPool.put(RubyInterpreter.TYPE_CODE.toUpperCase(), SpringUtil.getBean(RubyInterpreter.class));
        if (StringKit.isNotBlank(RubyInterpreter.ALIAS)) {
            interpreterPool.put(RubyInterpreter.ALIAS.toUpperCase(), SpringUtil.getBean(RubyInterpreter.class));
        }
        interpreterPool.put(ShellInterpreter.TYPE_CODE.toUpperCase(), SpringUtil.getBean(ShellInterpreter.class));
        if (StringKit.isNotBlank(ShellInterpreter.ALIAS)) {
            interpreterPool.put(ShellInterpreter.ALIAS.toUpperCase(), SpringUtil.getBean(ShellInterpreter.class));
        }
    }

    /**
     * 获取解析器
     *
     * @param typeCode 类型代码
     * @return _IResolver
     */
    public static __IInterpreter getInterpreter(Map<String, Object> idcRuntimePool, String typeCode) {
        __IInterpreter iResolver = interpreterPool.get(Func.toStr(typeCode, NashornInterpreter.TYPE_CODE).toUpperCase());
        if (iResolver == null) {
            IdcEngineEntry.throwException(idcRuntimePool, null, ("无法支持的动态解释器类型! [" + typeCode + "]"));
            return null;
        } else {
            return iResolver;
        }
    }
}
